# Python 中的 threading 模块


# threading 除了包含 _thread 模块重的所有功能外，还提供了更高级的 API。
# 它提供了 Thread、Lock、RLock、Condition、Semaphore、BoundedSemaphore、Event、Timer 等类。
# 这些类可以用来创建线程、同步线程、控制线程的执行、管理线程间的通信、实现线程间的同步等。

# threading 模块的使用方法如下：
# threading.current_thread()：获取当前线程的实例
# threading.enumerate()：获取当前所有线程的实例列表
# threading.active_count()：获取当前活动的线程数量
# threading.Thread(target, args=(), kwargs={}, daemon=None) : 创建一个线程实例，
#   target 为线程执行的目标函数
#   args 为函数参数, 以元组形式传入
#   kwargs 为函数关键字参数，以字典形式传入
#   daemon 为是否为守护线程，默认为 None。
# threading.Lock()：创建一个锁实例，用于线程间的同步。
# threading.RLock()：创建一个可重入锁实例，用于线程间的同步。
# threading.Condition()：创建一个条件变量实例，用于线程间的同步。
# threading.Semaphore()：创建一个信号量实例，用于控制线程的并发数量。
# threading.BoundedSemaphore()：创建一个有界信号量实例，用于控制线程的并发数量。
# threading.Event()：创建一个事件实例，用于线程间的同步。
# threading.Timer(interval, function, args=None, kwargs=None)：创建一个定时器实例，用于在指定时间后执行指定函数。
#    interval 为定时器的间隔时间，单位为秒
#    function 为定时器执行的函数
#    args 为函数参数, 以元组形式传入
#    kwargs 为函数关键字参数，以字典形式传入


# 以下是 threading.Thread 类的常用方法：
# __init__(self, group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)：构造函数
#    self：线程实例
#    group：线程组，默认为 None
#    target：线程执行的目标函数，默认为 None
#    name：线程的名称，默认为 None
#    args：函数参数，以元组形式传入
#    kwargs：函数关键字参数，以字典形式传入
#    daemon：是否为守护线程，默认为 None

# threading.Thread 实例对象的方法：
# start()：启动线程
# join()：等待线程结束
# is_alive()：判断线程是否存活
# run()：线程执行的入口函数，在线程启动时自动调用
# setDaemon(daemonic)：设置线程是否为守护线程
# getName()：获取线程的名称
# setName(name)：设置线程的名称
# isDaemon()：判断线程是否为守护线程
# join(timeout=None)：等待线程结束，最长等待 timeout 秒
# set_ident()：设置线程的 ID
# stack_size()：设置线程的栈大小
# get_ident()：获取线程的 ID

# threading.Thread 实例对象的属性：
# name：线程的名称
# ident：线程的 ID
# daemon：线程是否为守护线程


# 以下是一个简单的例子：

import threading
import time

def worker(n):
    print('线程 {} 开始运行'.format(n))
    # 睡眠 2 秒
    time.sleep(2)
    print('线程 {} 运行结束\n'.format(n))

threads = []
# 创建 5 个线程并启动
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

# 等待所有线程结束
for t in threads:
    # join() 实际上是将当前线程合并到主线程，当前线程结束后继续执行主线程
    # 这里的 t 就是线程实例
    t.join()

print('所有线程都结束了')


